module.exports = function (app, io, mongoose) {
  // 当前咨询socketId
  currentSocketId = "";
  // 客服socketId
  serviceId = "";
  // 当前在线的客服列表
  var onlineName = [];
  // 当前值班的客服的username 和 socketId
  var serviceName = "郭占锋";
  // 当前咨询的患者Id
  var onlinePatient = [];
  // 获取数据库Chat模块
  const Private = mongoose.model("Private");
  const Chat = mongoose.model("Chat");
  // socket 监听链接,表示已经建立的链接
  io.on("connection", function (socket) {
    // 发送当前在线患者
    io.emit("onlinePatients", {
      onlinePatient: onlinePatient
    });
    // // 获取视频地址
    // socket.on("notice", function (data) {
    //   console.log("notice", data)
    // })
    socket.on("login", function (data) {
      // 设置当前客服ID
      if (data.username == serviceName) {
        serviceId = socket.id;
        io.emit("newServiceId", serviceId);
        console.log(`当前客服ID ： ${serviceId}`);
      }
      // 把姓名挂载到socket上面
      socket.chatId = data.chatId;
      /**
       * 判断是否有chatId如果有就查询出来，
       * 如果没有chatId就存入一条
       */
      if (!data.chatId) {
        console.log("没有chatId,那就给她一个");
        //写入数据库B
        var privateData = new Private({
          status: 0,
          myCode: Math.random()
        });
        /** 插入数据 **/
        privateData.save(function (err, docs) {
          // 执行保存，并查看返回情况
          if (err) {
            console.log(err);
          } else {
            // 给患者一个名字
            socket.patientName = "患者" + (onlinePatient.length + 1);
            // 存入当前聊天的患者
            onlinePatient.push({
              // 患者名字
              patientName: socket.patientName,
              // 患者socketid
              patientId: socket.id,
              // 聊天Id
              chatId: docs._id,
              // 是否显示新消息
              showTips: false
            });
            // 返回当前的 聊天id 和 在线客服ID
            io.sockets.emit("getChatId", {
              // 当前聊天的id
              chatId: docs._id,
              // 当前的客服ID
              serviceId: serviceId,
              // 当前聊天的人的code
              myCode: docs.myCode,
              // 自己socketId
              mySocketId: socket.id,
              // 当前患者的名字
              patientName: socket.patientName
            });
          }
          // 发送当前在线患者
          // io.emit("onlinePatients", {
          //   onlinePatient: onlinePatient
          // });
        });
        // 写入数据库E
      }
      // 如果有就查询历史消息记录发送给用户
      else {
        // 如果 有 chatId就直接添加到当前在线列表
        onlinePatient.push({
          // 患者名字
          patientName: data.patientName,
          // 患者socketid
          patientId: socket.id,
          // 聊天Id
          chatId: data.chatId,
          // 是否显示新消息
          showTips: false
        });
      }
      // 删除患者姓名为空的
      onlinePatient.forEach((item, index) => {
        if (!item.patientName) {
          onlinePatient.splice(index, 1);
        }
      });
      // 返回最新的患者列表
      io.emit("onlinePatients", {
        onlinePatient: onlinePatient
      });
      // 登录后的数组
      console.log(socket.id + "登陆了" + onlinePatient.length + "在线人数");
    });
    //给指定的客户端发送消息
    socket.on("private", data => {
      console.log(data)
      // 显示当前的消息
      if (data.serviceId) {
        var chat = new Chat({
          msg: data.msg,
          chatId: data.chatId,
          time: data.time,
          myCode: data.myCode
        });
        console.log(chat);
        /** 插入数据
         *
         * */
        chat.save(function (err, docs) {
          // 执行保存，并查看返回情况
          if (err) {
            console.log(err);
          } else {
            Chat.find({
                chatId: docs.chatId
              },
              function (err, docs) {
                if (err) {
                  console.log("err:", err);
                  return;
                } else {
                  // 私聊发送消息
                  io.to(data.serviceId).emit("privates", {
                    data: docs,
                    newServiceId: serviceId
                  });
                }
              }
            );
          }
        });
      }
    });
    // 用户离开执行代码
    socket.on("disconnect", function () {
      // 循环在线列表删除刚才离开的人
      onlinePatient.forEach((item, index) => {
        if (item.patientId == socket.id) {
          onlinePatient.splice(index, 1);
          io.emit("onlinePatients", {
            onlinePatient: onlinePatient
          });
        }
      });
    });
    socket.on("reconnect", function () {
      console.log("重新连接到服务器");
    });
  });
  // 请求历史消息;
  app.get("/getChat", function (req, res) {
    currentSocketId = req.query.currentSocketId;
    Chat.find({
        chatId: req.query.chatId
      },
      function (err, docs) {
        if (err) {
          console.log("err:", err);
          return;
        } else {
          res.json(docs);
        }
      }
    );
  });
};
